package com.mycompany.crm.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.mycompany.crm.base.BaseService;
import com.mycompany.crm.dao.CusDevPlanMapper;
import com.mycompany.crm.dao.SaleChanceMapper;
import com.mycompany.crm.query.CusDevPlanQuery;
import com.mycompany.crm.query.SaleChanceQuery;
import com.mycompany.crm.service.CusDevPlanService;
import com.mycompany.crm.utils.AssertUtil;
import com.mycompany.crm.utils.DateFormatUtil;
import com.mycompany.crm.vo.CusDevPlan;
import com.mycompany.crm.vo.SaleChance;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 客户开发计划实现类
 * @author jy
 * @version 1.0
 * @date 2022/1/14 15:58
 */
@Service
public class CusDevPlanServiceImpl extends BaseService<CusDevPlan,Integer> implements CusDevPlanService {

    @Resource
    private CusDevPlanMapper cusDevPlanMapper;

    @Resource
    private SaleChanceMapper saleChanceMapper;

    /**
     * 多条件分页查询客户开发计划
     * @param cusDevPlanQuery
     * @return
     */
    @Override
    public Map<String,Object> queryCusDevPlanByParams(CusDevPlanQuery cusDevPlanQuery){
        //返回的格式必须是layui中表格呈现要求的格式map
        HashMap<String, Object> map = new HashMap<>();

        //开启分页
        PageHelper.startPage(cusDevPlanQuery.getPage(),cusDevPlanQuery.getLimit());
        //得到对应的分页对象
        PageInfo<CusDevPlan> pageInfo = new PageInfo<>(cusDevPlanMapper.selectByParams(cusDevPlanQuery));

        //设置map对象
        map.put("code",0);
        map.put("msg","success");
        map.put("count",pageInfo.getTotal());
        //设置分好页的列表
        map.put("data",pageInfo.getList());
        return map;
    }


    /**
     *
     *	添加计划项
     *	1. 参数校验
     *	营销机会ID  非空  记录必须存在
     *	计划项内容   非空
     *	计划项时间   非空
     *	2. 设置参数默认值
     *	is_valid
     *	crateDate
     *	updateDate
     *	3. 执行添加，判断结果
     *
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
    public void addCusDevPlan(CusDevPlan cusDevPlan) {
        //参数校验
        checkCusDevPlanParams(cusDevPlan);
        //设置参数的默认值
        cusDevPlan.setIsValid(1);
        cusDevPlan.setCreateDate(new Date());
        cusDevPlan.setUpdateDate(new Date());
        //执行添加操作，判断受影响的行数
        AssertUtil.isTrue(cusDevPlanMapper.insertSelective(cusDevPlan) != 1,"计划项数据添加失败！");
    }

    /**
     * 添加计划项数据的参数校验
     * @param cusDevPlan
     */
    private void checkCusDevPlanParams(CusDevPlan cusDevPlan) {
        //营销机会的id 非空且数据存在
        Integer sId = cusDevPlan.getSaleChanceId();
        AssertUtil.isTrue(null == sId || saleChanceMapper.selectByPrimaryKey(sId) == null,"数据异常，请重试！");
        //计划项内容 非空
        AssertUtil.isTrue(StringUtils.isBlank(cusDevPlan.getPlanItem()),"计划项内容不能为空!");
        //计划项时间 非空
        AssertUtil.isTrue(null == cusDevPlan.getPlanDate(),"计划项时间不能为空！");
//        DateFormatUtil.isValidDate(cusDevPlan.getPlanDate(),"计划时间格式错误！");
    }


    /**
     * 更新客户开发计划项数据
     * 1.参数校验
     *      计划项ID    非空，数据存在
     *      营销机会ID  非空，数据存在
     *      计划项内容   非空
     *      计划时间    非空
     * 2.设置参数的默认值
     *      修改时间    系统当前时间
     * 3.执行更新操作，判断受影响的行数
     *
     * @param cusDevPlan
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
    public void updateCusDevPlanParams(CusDevPlan cusDevPlan){
        //1.参数校验(计划项ID    非空，数据存在),checkCusDevPlanParams方法中没有的单独提出来
        AssertUtil.isTrue(null == cusDevPlan.getId() || cusDevPlanMapper.selectByPrimaryKey(cusDevPlan.getId()) == null,"数据异常，请重试！");
        checkCusDevPlanParams(cusDevPlan);
        //2.设置默认值(修改时间    系统当前时间)
        cusDevPlan.setUpdateDate(new Date());
        //3.执行更新操作，判断受影响的行数
        AssertUtil.isTrue(cusDevPlanMapper.updateByPrimaryKeySelective(cusDevPlan) != 1,"更新失败！");
    }

    /**
     * 删除计划项
     * 1.判断ID是否为空，且数据存在
     * 2.修改is_valid属性
     * 3.执行更新操作
     * @param id
     */
    @Override
    public void deleteCusDevPlan(Integer id) {
        CusDevPlan cusDevPlan = cusDevPlanMapper.selectByPrimaryKey(id);
        //1.判断ID是否为空，且数据存在
        AssertUtil.isTrue(null == id || cusDevPlan == null,"待删除的记录不存在！");
        //2.设置记录无效
        assert cusDevPlan != null;
        cusDevPlan.setIsValid(0);
        cusDevPlan.setUpdateDate(new Date());
        //判断受影响的行数
        AssertUtil.isTrue(cusDevPlanMapper.updateByPrimaryKeySelective(cusDevPlan) != 1,"计划项数据删除失败！");
    }
}
